package com.binhthuan.catechist.client.dto;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import name.pehl.piriti.client.json.Json;
import name.pehl.piriti.client.json.JsonReader;
import name.pehl.piriti.client.json.JsonWriter;

import com.google.gwt.core.client.GWT;

/**
 * @author Giang Đinh - Thông tin về học viên, tương ứng với bảng
 *         <b>hoc_vien</b> trong cơ sở dữ liệu.
 */
public class Trainee extends Person {

    public interface TraineeReader extends JsonReader<Trainee> {
    }
    public interface TraineeWriter extends JsonWriter<Trainee> {
    }

    public static TraineeReader READER = GWT.create(TraineeReader.class);
    public static TraineeWriter WRITER = GWT.create(TraineeWriter.class);

    /**
     * Ngày rửa tội.
     */
    @Json
    private Date baptismDay;
    
    /**
     * Nơi rửa tội.
     */
    @Json
    private String baptismPlace;
    
    /**
     * Ngày rước lễ lần đầu.
     */
    @Json
    private Date firstCommunionDay;
    
    /**
     * Nơi rước lễ lần đầu.
     */
    @Json
    private String firstCommunionPlace;
    
    /**
     * Ngày thêm sức.
     */
    @Json
    private Date confirmationDay;
    
    /**
     * Nơi thêm sức.
     */
    @Json
    private String confirmationPlace;
    
    /**
     * Cha.
     */
    @Json
    private Parent father;
    
    /**
     * Mẹ.
     */
    @Json
    private Parent mother;
    
    /**
     * Người đỡ đầu.
     */
    @Json
    private Parent sponsor;
    
    /**
     * Tình trạng của học viên.
     */
    @Json
    private TraineeStatus status;
    
    /**
     * Lớp hiện tại.
     */
    @Json
    private DoctrineClass doctrineClass;
    
    /**
     * Các lớp đã học.
     */
    @Json
    private Set<DoctrineClass> doctrineClasses;
    
    public Trainee() {
        doctrineClasses = new HashSet<DoctrineClass>(0);
    }
    
    /**
     * Lấy ngày rửa tội.
     * @return Ngày rửa tội.
     */
    public Date getBaptismDay() {
        return baptismDay;
    }

    /**
     * Gán ngày rửa tội.
     * @param baptismDay
     *            Ngày rửa tội.
     */
    public void setBaptismDay(Date baptismDay) {
        this.baptismDay = baptismDay;
    }

    /**
     * Lấy nơi rửa tội.
     * @return Nơi rửa tội.
     */
    public String getBaptismPlace() {
        return baptismPlace;
    }

    /**
     * Gán nơi rửa tội.
     * @param baptismPlace
     *            Nơi rửa tội.
     */
    public void setBaptismPlace(String baptismPlace) {
        this.baptismPlace = baptismPlace;
    }

    /**
     * Lấy ngày rước lễ lần đầu.
     * @return Ngày rước lễ lần đầu.
     */
    public Date getFirstCommunionDay() {
        return firstCommunionDay;
    }

    /**
     * Gán ngày rước lễ lần đầu.
     * @param firstCommunionDay
     *            Ngày rước lễ lần đầu.
     */
    public void setFirstCommunionDay(Date firstCommunionDay) {
        this.firstCommunionDay = firstCommunionDay;
    }

    /**
     * Lấy nơi rước lễ lần đầu.
     * @return nơi rước lễ lần đầu.
     */
    public String getFirstCommunionPlace() {
        return firstCommunionPlace;
    }

    /**
     * Gán nơi rước lễ lần đầu.
     * @param firstCommunionPlace
     *            Nơi rước lễ lần đầu.
     */
    public void setFirstCommunionPlace(String firstCommunionPlace) {
        this.firstCommunionPlace = firstCommunionPlace;
    }

    /**
     * Lấy ngày thêm sức.
     * @return Ngày thêm sức.
     */
    public Date getConfirmationDay() {
        return confirmationDay;
    }

    /**
     * Gán ngày thêm sức.
     * @param confirmationDay
     *            Ngày thêm sức.
     */
    public void setConfirmationDay(Date confirmationDay) {
        this.confirmationDay = confirmationDay;
    }

    /**
     * Lấy nơi thêm sức.
     * @return Nơi thêm sức.
     */
    public String getConfirmationPlace() {
        return confirmationPlace;
    }

    /**
     * Gán nơi thêm sức.
     * @param confirmationPlace
     *            Nơi thêm sức.
     */
    public void setConfirmationPlace(String confirmationPlace) {
        this.confirmationPlace = confirmationPlace;
    }

    /**
     * Lấy thông tin cha.
     * @return Thông tin cha..
     */
    public Parent getFather() {
        return father;
    }

    /**
     * Gán thông tin cha.
     * @param father
     *            Thông tin cha.
     */
    public void setFather(Parent father) {
        this.father = father;
    }

    /**
     * Lấy thông tin mẹ.
     * @return Thông tin mẹ.
     */
    public Parent getMother() {
        return mother;
    }

    /**
     * Gán thông tin mẹ.
     * @param mother
     *            Thông tin mẹ.
     */
    public void setMother(Parent mother) {
        this.mother = mother;
    }

    /**
     * Lấy thông tin người đỡ đầu.
     * @return Thông tin người đỡ đầu.
     */
    public Parent getSponsor() {
        return sponsor;
    }

    /**
     * Gán thông tin người đỡ đầu.
     * @param sponsor
     *            Thông tin người đỡ đầu.
     */
    public void setSponsor(Parent sponsor) {
        this.sponsor = sponsor;
    }

    /**
     * Lấy tình trạng hiện tại.
     * @return Tình trạng hiện tại.
     */
    public TraineeStatus getStatus() {
        return status;
    }

    /**
     * Gán tình trạng hiện tại.
     * @param status
     *            Tình trạng hiện tại.
     */
    public void setStatus(TraineeStatus status) {
        this.status = status;
    }

    /**
     * Lấy lớp học hiện tại.
     * @return Lớp học hiện tại.
     */
    public DoctrineClass getDoctrineClass() {
        return doctrineClass;
    }

    /**
     * Gán lớp học hiện tại.
     * @param doctrineClass
     *            Lớp học hiện tại.
     */
    public void setDoctrineClass(DoctrineClass doctrineClass) {
        this.doctrineClass = doctrineClass;
    }

    /**
     * Lấy các lớp đã học.
     * @return Các lớp đã học.
     */
    public Set<DoctrineClass> getDoctrineClasses() {
        return doctrineClasses;
    }

    /**
     * Gán các lớp đã học.
     * @param doctrineClasses
     *            Các lớp đã học.
     */
    public void setDoctrineClasses(Set<DoctrineClass> doctrineClasses) {
        this.doctrineClasses = doctrineClasses;
    }
}
